<?php
$nums = [1,3,2,2,3];
sort($nums);
$r = removeDuplicates($nums);
echo $r . PHP_EOL;
var_dump($nums);
/**
https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2gy9m/
题目：
删除排序数组中的重复项
给你一个有序数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。
不要使用额外的数组空间，你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
提示：
0 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按升序排列
*/

/***
解题思路：
数组已经按照升序排序，意味着只要相邻元素相等，就是重复的
使用双指针，$slow 负责记录不同的键， $fast 负责遍历数组所有的键，遍历过程中，如果 $nums[$fast] 不等于 $nums[$fast - 1]，$slow 原地改变这个值为后面的一个不重复的元素
***/

/**
 *
 * 使用双指针
 * @param $nums
 * @return int
 */
function removeDuplicates(&$nums)
{
    $n = count($nums);
    if ($n < 2) {
        return 0;
    }
    $fast = $slow = 1;
    while ($fast < $n) {
        if ($nums[$fast] != $nums[$fast - 1]) {
            $nums[$slow] = $nums[$fast];
            ++$slow;
        }
        ++$fast;
    }
    return $slow;
}